/***
1. 在DIVA的視窗右下方有4個按鈕，OnlineBtn的部份是用來決定要不要啟動Collision_lyvm
2. 這個檔案主要是要用來處裡碰撞的問題，碰撞可能會發生的時間點大概有幾個
		a. 當我們在做drag的時候                (MyExampleInput.cpp  line: 270   )
        b. 當有新的VM被新增加到我們DIVA的視窗時(RegularPointer_new_lyvm  line: 33)
	所以在這幾個地方我都有加入觸發點
3. 目前的collision 移動的方式是採用 OOPSLA 的影片中的移動方式 也是比較符合一般認知的移動
   所以沒有用到 densityFunction 以及 ballFieldFunction

   在Collision_lyvm.cpp 的第 54 及 74 行這2個被mark的是論文上所描述的方法所呼叫的
   在63-67 以及 77-81 這2部分則上面所描述的為了oopsla所用
***/

#ifndef _Collision_lyvm_H_
#define	_Collision_lyvm_H_
/*------------------------------------------------------------*/

#include "DIVA_VM.h"
#include "MappingEngine.h"

//using namespace Ogre;

class Collision_lyvm{
private:	
    static Collision_lyvm* CollisionLVM;
	Collision_lyvm();

	DIVA_VM* _vm;

	std::vector<DIVA_VM*> _allSameTypeVMs;

	void moveMySelf(DIVA_VM*);
	void move_to_destination(DIVA_VM*,Ogre::Vector3);
	std::vector<DIVA_VM*> collidedVMs(DIVA_VM*);
	//std::vector<DIVA_VM*> collidedVMsByPos(Vector3);
	//std::vector<DIVA_VM*> collidedVMsByPos(DIVA_VM*);
	std::vector<Ogre::Vector3> collisionDirection(DIVA_VM*,DIVA_VM*);
	std::multimap<Ogre::Vector3,int> densityFunction(DIVA_VM*);
	std::multimap<Ogre::Vector3,int> ballFieldFunction(DIVA_VM*,double);

	std::vector<Ogre::Vector3> getRelatedDirections(DIVA_VM*,DIVA_VM*);

	void position(std::vector<Ogre::Vector3>,DIVA_VM*);
	double getMoveDistance(DIVA_VM*);
	int get_number(int);
	bool turnon;
	
public:
	/// destructor
	~Collision_lyvm();

	/// singleton method
	static Collision_lyvm* getInstance();
	std::vector<DIVA_VM*> collision_handling(std::vector<DIVA_VM*>,DIVA_VM*);
	bool lyvmIsTurnOn();
	void switcher(bool);
	

};
#endif 